热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

树--二叉树的数组实现

树--二叉树的数组实现简要介绍:树是节点的有限集合度:当前结点的子节点的数量叶子:(终端节点)根:(非终端节点)有序数:子节点不能互换顺序无序数:子节点能互换顺序深度:节点深度和树的深度节点深度:第一
树--二叉树的数组实现

简要介绍:
树是节点的有限集合
度:当前结点的子节点的数量
叶子:(终端节点)
根:(非终端节点)
有序数:子节点不能互换顺序
无序数:子节点能互换顺序

深度:节点深度和树的深度
节点深度:第一层深度为1,第二层深度为2,第三层深度为3...
数的深度:当前树的节点所具有的最大深度

森林:多颗独立的树,一棵树看成由不同的子树,也是森林

二叉树:所有节点的度 <= 2;

二叉树的遍历:前序遍历、中序遍历、后序遍历
前序遍历:先访问根,后访问左右节点
中序遍历:先访问左节点,然后访问根,最后访问右节点
后序遍历:先访问左右节点,后访问根


二叉树的数组表示:
//-----------------------------------------------
Tree.h
#ifndef TREE_H
#define TREE_H

//-----------------------------------
//-----二叉树的数组表示--------------
class Tree{

public:
Tree(int size, int *pRoot);//大小,根节点
~Tree();
int *searchNode(int nodeIndex);//按照索引找节点
bool addNode(int nodeIndex, int direction, int *pNode);//增加节点,direction为0是左节点,为1是右节点
bool deleteNode(int nodeIndex, int *pNode);//根据索引删除节点,并拿出来给*pNode
void treeTraverse();//遍历

private:
int *m_pTree;//节点指针
int m_iSize;//大小
};

#endif


Tree.cpp
#include"Tree.h"
#include
using namespace std;

Tree::Tree(int size, int *pRoot){

m_iSize = size;
m_pTree = new int[m_iSize];
m_pTree[0] = *pRoot;
for(int i = 1; i m_pTree[i] = 0;
}
}
Tree::~Tree(){

delete []m_pTree;
m_pTree = NULL;
}
int *Tree::searchNode(int nodeIndex){

if(nodeIndex <0 || nodeIndex >= m_iSize){
return NULL;
}

if(0 == m_pTree[nodeIndex]){
return NULL;
}
return &m_pTree[nodeIndex];
}

bool Tree::addNode(int nodeIndex, int direction, int *pNode){

if(nodeIndex <0 || nodeIndex >= m_iSize){
return false;
}

if(0 == m_pTree[nodeIndex]){
return false;
}
//--------------------------------------
if(0 == direction){//左节点

if(nodeIndex*2 + 1 >= m_iSize){
return false;
}

if(0 != m_pTree[nodeIndex*2 + 1]){//说明里面已经有元素了
return false;
}
m_pTree[nodeIndex*2 + 1] = *pNode;
return true;
 }
//---------------------------------------
if(1 == direction){//右节点

if(nodeIndex*2 + 2 >= m_iSize){
return false;
}

if(0 != m_pTree[nodeIndex*2 + 2]){
return false;
}
m_pTree[nodeIndex*2 + 2] = *pNode;
return true;
 }
return false;

}

bool Tree::deleteNode(int nodeIndex, int *pNode){

if(nodeIndex <0 || nodeIndex >= m_iSize){
return false;
}

if(0 == m_pTree[nodeIndex]){
return false;
}

*pNode = m_pTree[nodeIndex];
m_pTree[nodeIndex] = 0;
return true;
}
void Tree::treeTraverse(){

for(int i = 0; i cout < }
cout <}


demo.cpp
#include"Tree.h"
#include
using namespace std;
//-------------------

int main(){

int root = 1;
Tree *p = new Tree(7, &root);

int node[] = {2, 3, 5, 7, 8};

p->addNode(0, 0, &node[0]);//根的左节点
p->addNode(0, 1, &node[1]);//根的右节点

p->addNode(2, 0, &node[2]);//根的右节点的左节点
p->addNode(2, 1, &node[3]); //根的右节点的右节点

p->treeTraverse();

cout <<"\n根的右节点的右节点:" <<*(p->searchNode(6)) <
int t = 0;
p->deleteNode(6, &t);
cout <<"\n删除的节点:" < cout <<"\n再次遍历:" < p->treeTraverse();

delete p;//一不小心写成delete []p;就错了,调试半天,哎~
p = NULL;

system("pause");
return 0;
}

//控制台运行得:
1 2 3 0 0 5 7

根的右节点的右节点:7

删除的节点:7

再次遍历:
1 2 3 0 0 5 0
//-------------------------------------------------------------------
//------------------------------------------------------------------
   

推荐阅读
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • HashMap的扩容知识详解
    本文详细介绍了HashMap的扩容知识,包括扩容的概述、扩容条件以及1.7版本中的扩容方法。通过学习本文,读者可以全面了解HashMap的扩容机制,提升对HashMap的理解和应用能力。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
author-avatar
wocanimagebi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有